/**
 * 通用工具函数
 * @author 阿逼
 * @date 2021-08-02
 */

const log = require('./log4j')
const CODE = {
  SUCCESS: 200,
  PARAM_ERROR: 10001, // 参数错误
  USER_ACCOUNT_ERROR: 20001, // 账号或密码错误
  USER_LOGIN_ERROR: 30001, // 用户未登录
  BAUSINESS_ERROR: 40001, // 业务请求失败
  AUTH_ERROR: 50001, // 认证失败或Token过期
}

module.exports = {
  CODE,
  /**
   * 分页结构封装
   * @param {number} pageNum:頁數
   * @param {number} pageSize:每頁顯示
   * @returns {object} {page:{},skipIndex}
   */
  pager({ pageNum = 1, pageSize = 10 }) {
    pageNum *= 1
    pageSize *= 1
    const skipIndex = (pageNum - 1) * pageSize
    return {
      page: {
        pageNum,
        pageSize,
      },
      skipIndex,
    }
  },
  success(data = '', msg = '', code = CODE.SUCCESS) {
    // log.debug(data)
    return {
      code,
      data,
      msg,
    }
  },
  fail(msg = '', code = CODE.BAUSINESS_ERROR) {
    log.debug(msg)
    return {
      msg,
      code,
    }
  },
  /**
   * 树型菜单处理
   * @param {Array} data 数据库扁平数据
   * @param {String} id 键值ID
   * @param {Array} list 引用类型
   * @returns
   */
  getTreeMenu(data, id, list) {
    for (let i = 0; i < data.length; i++) {
      let item = data[i]
      if (String(item.parentId.slice().pop()) == String(id)) {
        list.push(item._doc)
      }
    }
    list.map((item) => {
      item.children = []
      this.getTreeMenu(data, item._id, item.children)
      // 判断按钮
      if (item.children.length == 0) {
        delete item.children
      } else if (item.children.length > 0 && item.children[0].menuType == 2) {
        // 快速区分按钮和菜单，用户权限控制
        item.action = item.children
      }
    })
    return list
  },
  /**
   * 时间格式化
   * @param {Date} date 日期对象
   * @param {*} rule 验证规则
   * @returns fmt
   */
  formateDate(date, rule) {
    let fmt = rule || 'yyyy-MM-dd hh:mm:ss'
    if (/(y+)/.test(fmt)) {
      fmt = fmt.replace(RegExp.$1, date.getFullYear())
    }
    const o = {
      // 'y+': date.getFullYear(),
      'M+': date.getMonth() + 1,
      'd+': date.getDate(),
      'h+': date.getHours(),
      'm+': date.getMinutes(),
      's+': date.getSeconds(),
    }
    for (let k in o) {
      if (new RegExp(`(${k})`).test(fmt)) {
        const val = o[k] + ''
        fmt = fmt.replace(
          RegExp.$1,
          RegExp.$1.length == 1 ? val : ('00' + val).substr(val.length)
        )
      }
    }
    return fmt
  },
}
